package bin_tree.heap.leetcode;

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

/**
 * 和最小的K对数字
 *
 * @author shkstart
 * @create 2022-10-30-18:19
 */
public class Num373 {

    private class Pair implements Comparable<Pair> {
        //第一个数组元素
        int u;
        //第二个数组元素
        int v;

        public Pair(int u, int v) {
            this.u = u;
            this.v = v;
        }

        @Override
        public int compareTo(Pair o) {
            return (o.u + o.v) - (this.u + this.v);
        }
    }

    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {

       Queue<Pair> queue = new PriorityQueue<>();
//        最外层取U值
        for (int i = 0; i <Math.min(nums1.length,k); i++) {
//            内层取V值
            for (int j = 0; j < Math.min(nums2.length, k); j++) {
                if(queue.size()<k){
                    queue.offer(new Pair(nums1[i],nums2[j]));
                }else{
                    Pair pair = queue.peek();
                    if(nums1[i]+nums2[j]<(pair.u+pair.v)){
                        queue.poll();
                        queue.offer(new Pair(nums1[i], nums2[j]));
                    }
                }
            }
        }
//        队列中存储了前K个最小的pair对象
    List<List<Integer>> ret = new ArrayList<>();
//        边界条件k>queue.size()
        for (int i = 0; i < k && !(queue.isEmpty()); i++) {
            List<Integer> temp = new ArrayList<>();
            Pair pair = queue.poll();
            temp.add(pair.u);
            temp.add(pair.v);

            ret.add(temp);
        }
        return  ret;

    }
}
